from card_manager_system.card_class import Card
import db_conn_util
from utils.str_util import get_valid_input, is_digit, is_non_empty


def menu():
    print('*' * 30)
    print('''欢迎使用【名片管理系统】！
    请选择要使用的功能：
    1. 新建名片
    2. 显示全部
    3. 查询名片
    4. 修改名片
    5. 删除名片
    0. 退出系统'''
          )
    print('*' * 30)


def search_card_mode_menu():
    print('*' * 12 + '查询名片' + '*' * 11)
    print('''请选择查询方式：
    301. 按姓名查询
    302. 按编号查询
    300. 退出查询'''
          )


def create_card():
    print('*' * 12 + '新建名片' + '*' * 11)
    name = get_valid_input('请输入姓名：', is_non_empty)
    phone = get_valid_input('请输入电话：', is_non_empty)
    qq = get_valid_input('请输入QQ：', is_non_empty)
    email = get_valid_input('请输入邮箱：', is_non_empty)
    effect_count = db_conn_util.create_card(Card(name, phone, qq, email))
    if effect_count == 1:
        print('添加成功！')
    else:
        print('添加失败！')


def show_all():
    print('*' * 12 + '显示全部' + '*' * 11)
    cards = db_conn_util.show_card()
    if not cards:
        print('没有名片记录！')
    else:
        for card in cards:
            card.display_info()


def search_card():
    while True:
        search_card_mode_menu()
        choice = input("请输入你的选择：")
        if choice == "301":
            search_card_by_mode(301)
            break
        elif choice == "302":
            search_card_by_mode(302)
            break
        elif choice == "300":
            break
        else:
            print('无效的选择，请重新选择。')


def search_card_by_mode(mode):
    if mode == 301:
        print('*' * 12 + '按姓名查询' + '*' * 11)
        name = get_valid_input('请输入姓名：', is_non_empty)
        card = Card(name=name)
    elif mode == 302:
        print('*' * 12 + '按编号查询' + '*' * 11)
        card_id = int(get_valid_input('请输入编号：', is_digit))
        card = Card(card_id=card_id)
    else:
        print('无效的选择，请重新选择。')
        return
    cards = db_conn_util.show_card(card)
    if not cards:
        print('没有名片记录！')
    else:
        for card in cards:
            card.display_info()


def modify_card():
    print('*' * 12 + '修改名片' + '*' * 11)
    while True:
        card_id = int(get_valid_input('请输入要修改的编号(输入0退出)：', is_digit))
        if card_id == 0:
            print("已退出修改名片！")
            return
        cards = db_conn_util.show_card(Card(card_id=card_id))
        if not cards:
            print('该编号不存在，请重新输入！')
        else:
            break
    name = input('请输入修改后的姓名(输入空格跳过该项)：').strip()
    phone = input('请输入修改后的电话(输入空格跳过该项)：').strip()
    qq = input('请输入修改后的QQ(输入空格跳过该项)：').strip()
    email = input('请输入修改后的邮箱(输入空格跳过该项)：').strip()
    effect_count = db_conn_util.update_card(Card(name, phone, qq, email, card_id))
    if not effect_count:
        print('没有修改任何记录！')
    else:
        print('已成功修改！')


def delete_card():
    print('*' * 12 + '删除名片' + '*' * 11)
    while True:
        card_id = int(get_valid_input('请输入要删除的编号(输入0退出)：', is_digit))
        if card_id == 0:
            print("已退出删除名片！")
            return
        cards = db_conn_util.show_card(Card(card_id=card_id))
        if not cards:
            print('该编号不存在，请重新输入！')
        else:
            confirm = input("确认删除？(输入：Y确认/其他键取消)：")
            if confirm.upper() == 'Y':
                break

    effect_count = db_conn_util.delete_card(card_id)
    if not effect_count:
        print('没有删除任何记录！')
    else:
        print('已成功删除！')


def app():
    choice = input("请输入你的选择：").strip()
    if choice == "1":
        create_card()
    elif choice == "2":
        show_all()
    elif choice == "3":
        search_card()
    elif choice == "301":
        search_card_by_mode(301)
    elif choice == "302":
        search_card_by_mode(302)
    elif choice == "4":
        modify_card()
    elif choice == "5":
        delete_card()
    elif choice == "0":
        print("欢迎下次使用【名片管理系统】！")
        exit(0)
    else:
        print("无效的选择，请重新选择。")


while True:
    menu()
    app()
